/* 
 * File:   Conexion.cpp
 * Author: maximiliano
 * 
 * Created on 29 de mayo de 2013, 18:36
 */

#include "client_ObservadorSocket.h"
using namespace TP::Comunicacion;

ObservadorSocket::ObservadorSocket(SocketAsincronico* pSocket) {
    _socket = pSocket;
    _ejecutando = false;
    _descripcion = "OBSERVADOR-SOCKET";
}

ObservadorSocket::~ObservadorSocket() {
    _socket = NULL;
}

void ObservadorSocket::tarea (){
    
    /* Debe escuchar el socket por comunicaciones entrantes.  Tras detectar 
     * una comunicacion entrante por parte del servidor, debe levantar el mensaje
     * y notificarlo al manejador de eventos.
     * 
     */
    while (_ejecutando)
    {
        try
        {
            // Obtengo el mensaje del socket.
            
            uint8_t* buffer;
            uint32_t longitud;
            _socket->Leer(buffer, longitud);

            if (longitud > 0)
            {
                // Transformo el mensaje en un string;
                string mensaje = "";
                for (size_t i = 0; i < longitud; i++)
                {
                    mensaje += buffer [i];
                }
                delete [] buffer;

                // Notifico el mensaje.
                _observador->notificarMensajeEntranteServidor(reinterpret_cast<IEnviante*>(this), mensaje);
                
                int a = 0;
                a ++;
            }
        }
        catch (Excepcion &ex)
        {
            _observador->notificarErrorConexion(reinterpret_cast<IEnviante*>(this), ex.what());
        }
    }
}

IObservadorSocketManejadorEvento* ObservadorSocket::SetObservador(IObservadorSocketManejadorEvento* pObservador){
    _observador = pObservador;
    return pObservador;
}

void ObservadorSocket::Iniciar() throw (Excepcion&){
    try
    {
        _ejecutando = true;
        Thread::Iniciar();
    }
    catch (Excepcion &ex)
    {
        throw;
    }
}

void ObservadorSocket::Finalizar() throw (Excepcion&){
    try
    {
        _ejecutando = false;
        Thread::Finalizar();
    }
    catch (Excepcion &ex)
    {
        throw;
    }
}

string& ObservadorSocket::GetDescripcion (){
    return _descripcion;
}